package com.evil.application.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.evil.application.mapper.ApplicationOrderNodeHandlerMapper;
import com.evil.application.pojo.dto.order.log.OrderNodeAssigneeDTO;
import com.evil.application.pojo.dto.order.node.HandleOrderNodeReqDTO;
import com.evil.application.pojo.dto.order.node.handler.QueryOrderNodeHandler;
import com.evil.application.pojo.entity.ApplicationOrder;
import com.evil.application.pojo.entity.ApplicationOrderNodeHandler;

import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 应用订单节点处理人表
 *
 * @author liyang
 * @date 2022-08-08 00:00
 */
public interface ApplicationOrderNodeHandlerService extends IService<ApplicationOrderNodeHandler> {

    @Override
    ApplicationOrderNodeHandlerMapper getBaseMapper();

    /**
     * 获取订单节点处理人
     *
     * @param applicationOrder applicationOrder
     * @return ApplicationOrderNodeHandler 列表
     */
    List<ApplicationOrderNodeHandler> orderNodeHandlers(ApplicationOrder applicationOrder);

    /**
     * 获取订单节点处理人
     *
     * @param orderId    orderId
     * @param handleType handleType
     * @return ApplicationOrderNodeHandler 列表
     */
    List<ApplicationOrderNodeHandler> orderNodeHandlers(Long orderId, int handleType);

    /**
     * 获取订单节点处理人
     *
     * @param queryOrderNodeHandler queryOrderNodeHandler
     * @return ApplicationOrderNodeHandler 列表
     */
    List<ApplicationOrderNodeHandler> orderNodeHandlers(QueryOrderNodeHandler queryOrderNodeHandler);

    /**
     * 获取订单节点处理人
     *
     * @param orderIds orderIds
     * @return ApplicationOrderNodeHandler 列表
     */
    Map<Long, List<ApplicationOrderNodeHandler>> findMapByOrderIds(Collection<Long> orderIds);

    /**
     * 修改订单节点处理人
     *
     * @param orderId            orderId
     * @param nodeId             nodeId
     * @param handleType         handleType
     * @param orderNodeAssignees orderNodeAssignees
     */
    void modifyOrderNodeHandler(Long orderId, Long nodeId, Integer handleType, List<OrderNodeAssigneeDTO> orderNodeAssignees);

    /**
     * 处理订单节点处理人
     *
     * @param handleOrderNodeReqDTO handleOrderNodeReqDTO
     * @return 如果全部已处理，则返回处理时间
     */
    Date handleOrderNodeHandler(HandleOrderNodeReqDTO handleOrderNodeReqDTO);

    /**
     * 刷新搜索引擎 订单节点处理人
     *
     * @param applicationOrder applicationOrder
     */
    void refreshEsOrderNodeHandler(ApplicationOrder applicationOrder);

    /**
     * 检查指定订单当前登录人
     *
     * @param orderId orderId
     * @param nodeId  nodeId
     */
    void checkLoginUserNodeHandle(Long orderId, Long nodeId);

}
